package main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class CommandWindowInterface {

	private static String _grammar = "";

	static void startWindowInterface(String grammar){
		_grammar = splitGrammarInLines(grammar);
		welcomeMessage();
		InputStreamReader inputStreamReader = new InputStreamReader(System.in);
		BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

		boolean exitRequested = false;
		while (!exitRequested){
			askForCommand();
			try {
				String command = bufferedReader.readLine();
				if (command.length() == 0){
					System.out.println("No ha ingresado ningun comando.");
				} else if (command.equals("exit")){
					exitRequested = true;
				} else if (command.equals("grammar")){
					printOutGrammar();
				} else if (command.equals("help")){
					printOutProgramInstructions();
				} else {
					String[] commandSplitted = command.split(" ");

					if (commandSplitted[0].equals("parse")){
						if (commandSplitted.length == 1){
							System.out.println("No ha ingresado ninguna cadena.");
						} else {
							if (commandSplitted.length > 2){
								System.out.println("Atencion: El sistema solo parseara la primera cadena.");
							}
							if(commandSplitted[1].equals("''")){
								parseString("");
							}else{
								parseString(commandSplitted[1]);
							}
						}
					} else { 
						System.out.println("Comando invalido.");
					}
				}
			} catch (IOException e) {
				mostrarError(e);
			}
		}
		goodByeMessage();
	}

	private static String splitGrammarInLines(String grammar) {
		String splitGrammar = "";

		String[] grammarProductions = grammar.split(";");

		for (int i = 0; i < grammarProductions.length; i++){
			splitGrammar += grammarProductions[i] + "\n";
		}

		return splitGrammar;
	}

	private static void parseString(String string) {
		System.out.println();
		System.out.println("Cadena a parsear: " + string);
		System.out.println();

		try {
			Main.parse(string);
		} catch (ParseFailedException e) {
			System.out.println();
			System.out.println("La cadena no pudo ser parseada correctamente.");
			System.out.println();
		}
	}

	private static void welcomeMessage(){
		System.out.println();
		System.out.println("Bienvenido al analizador sintactico.");
		System.out.println("Usted esta trabajando con la siguiente gramatica.");
		printOutGrammar();
		printOutProgramInstructions();
	}

	private static void printOutGrammar(){
		System.out.println();
		System.out.println("Gramatica:");
		System.out.println();
		System.out.println(_grammar);
		System.out.println();
	}

	private static void printOutProgramInstructions() {
		System.out.println();
		System.out.println("Instrucciones:");
		System.out.println();
		System.out.println("Existen 4 comandos que pueden utilizarse en el sistema:");
		System.out.println();
		System.out.println(" - help: Muestra la informacion de ayuda.");
		System.out.println(" - grammar: Muestra la gramatica conque se esta trabajando.");
		System.out.println(" - parse <cadena>: Intenta parsear la <cadena>.");
		System.out.println(" - exit: Cierra la aplicacion.");
	}

	private static void askForCommand() {
		System.out.println();
		System.out.println("Por favor, indique un comando para continuar.");
		System.out.println();
		System.out.print(" --> ");
	}

	private static void goodByeMessage() {
		System.out.println();
		System.out.println("Gracias por utilizar el analizador sintactico.");
		System.out.println("Que tenga un buen dia.");
		System.out.println();
	}

	private static void mostrarError(IOException e) {
		System.out.println();
		System.out.println("Hubo un error inesperado:");
		System.out.println();
		e.printStackTrace(System.out);
		System.out.println();
		System.out.println("Por favor, vuelva a intentarlo.");
	}
}
